package com.ray.auth.system.service.impl;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.ray.auth.system.emun.UseStatus;
import com.ray.auth.system.service.UserGroupService;
import com.ray.auth.system.table.customMapper.CustomUserGroupMapper;
import com.ray.auth.system.table.entity.UserGroup;
import com.ray.auth.system.table.entity.UserGroupExample;
import com.ray.auth.system.table.mapper.UserGroupMapper;
import com.xiaoleilu.hutool.util.StrUtil;
import com.zjhc.flyhong.common.function.enums.DeleteEnum;
/**
 * <h1>系统权限应用  用户组  服务实现</h1>
 * @创建人 ray
 * @创建时间 2017-06-13
 * @版本 1.0
 * @重要修改备注 
 * 
 */
@Service
public class UserGroupServiceImpl implements UserGroupService {
	/**************实现类  其他对象 引用  开始***********************/
	/**应用数据库操作对象**/
	@Autowired
	private UserGroupMapper userGroupMapper;
	@Autowired
	private CustomUserGroupMapper customUserGroupMapper;
	/**************实现类  其他对象 引用  结束***********************/
	/**
     * 查询用户所在的当前用户组
     * @param userId 用户
     * @return 用户组ID列表
     */
	@Transactional(propagation=Propagation.NOT_SUPPORTED)
	public List<String> queryGroupsByUserId(String userId) {
		List<String> result  = new ArrayList<String>();
		//遍历用户所在的当前部门
		for(UserGroup userGroup :customUserGroupMapper.selectGroupByUser(userId,UseStatus.ON.getType(), DeleteEnum.USE.getValue())){
			result.add(userGroup.getGroupId());
		}
		return result;
	}
	/**
     * 查询用户所在的当前用户组包括上级用户组
     * @param userId 用户
     * @return 用户组ID列表
     */
	@Transactional(propagation=Propagation.NOT_SUPPORTED)
	public List<String> queryGroupsAllByUserId(String userId) {
		List<String> result  = new ArrayList<String>();
		List<String> parentGroupIds  = new ArrayList<String>();
		//遍历用户所在的当前部门
		for(UserGroup userGroup :customUserGroupMapper.selectGroupByUser(userId,UseStatus.ON.getType(), DeleteEnum.USE.getValue())){
			//如果存在上级组织 就存放上级组织ID
			if(StrUtil.isNotBlank(userGroup.getParentGroupId())){
				parentGroupIds.add(userGroup.getParentGroupId());
			}
			result.add(userGroup.getGroupId());
		}
		//查询当前用户组的上级用户组
		In_queryParentUserGroup(parentGroupIds,result);
		return result;
	}
	
	
	
	
	/****************内部方法******************************/
	/**
	 * 查询用户组 的所有上级用户组
	 * @param thisGroupIds
	 * @param result 结果存放对象
	 */
	@Transactional(propagation=Propagation.NOT_SUPPORTED)
	private void In_queryParentUserGroup(List<String> thisGroupIds, List<String> result) {
		//当查询的用故障为空 不进行查询
		if(thisGroupIds.isEmpty())return ;
		UserGroupExample example = new UserGroupExample();
		example.createCriteria().andGroupIdIn(thisGroupIds)
		.andIsDeleteEqualTo(DeleteEnum.USE.getValue());
		List<String> parentGroupIds  = new ArrayList<String>();
		//遍历用户所在的当前部门
		for(UserGroup userGroup :userGroupMapper.selectByExample(example)){
			//如果存在上级组织 就存放上级组织ID
			if(StrUtil.isNotBlank(userGroup.getParentGroupId())){
				parentGroupIds.add(userGroup.getParentGroupId());
			}
			result.add(userGroup.getGroupId());
		}
		//查询当前用户组的上级用户组
		In_queryParentUserGroup(parentGroupIds,result);
	}
	
	
	
	
}
